package com.life.dao.service;


import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.persister.entity.AbstractEntityPersister;


public interface IGenericDao<T, PK extends Serializable> {
	List<T> getAll();

	/**
	 * 
	 * @param id
	 * @return
	 */
	T get(PK id);

	public int excuteUpdateColl(String queryNameStr, Object[] obj);

	boolean exists(PK id);

	public void mergeObj(Object entity);

	void updateObj(Object obj);

	void updateList(List<T> list);

	void evict(Object obj);

	void clearFlush();

	T save(T object);

	Object exceuteSql(String sql);
	
	void update(T object);

	void saveList(List<T> list);

	void saveObj(Object obj);
	/**
	 * 扩展save返回主键
	 * @param obj
	 * @return
	 */
	Object saveObjSuper(Object obj);

	void remove(PK id);
	
	void remove(T object);

	void saveOrUpdateObj(Object obj);

	void saveListObj(List list);

	public void del(Object entity);

	public void delAll(List entities);

	public void flush();

	int excuteUpdate(String entityName, Map<String, Object> parmMap);

	List<T> getAllDistinct();

	List<T> getAll(Map<String, Object> equalMap, Map<String, Object> orderMap);

	List<T> findByNamedQuery(String queryName, Map<String, Object> queryParams);

	List<Object> getListByNamedQueryParas(final String queryName, final Map<String, Object> queryParams);

	List<Object> getListByNamedQuery(String queryName);

	/**
	 * 通过在配置文件中预定义的SQL串名字查询结果集;
	 * 
	 * @param queryName
	 *            在配置文件中预定义的SQL串名字
	 * @param value
	 *            在SQL中预定义的参数对应值;
	 * @return
	 */
	List<Object> getListByParm(String queryName, Object[] value);

	/**
	 * 通过在配置文件中预定义的SQL串名字查询结果集;
	 * 
	 * @param queryName
	 *            在配置文件中预定义的SQL串名字
	 * @param parms
	 * @param value
	 *            在SQL中预定义的参数对应值;
	 * @return
	 */
	List<Object> getListByParm(String queryName, String[] parms, Object[] value);

	List<Object> getListByParm(String queryName, Object[] value, Class cls);

	List<Object> getListByParm(String queryName, Object[] value, Class cls, int start, int pagesize);

	/**
	 * 通过在配置文件中预定义的SQL串名字查询结果集;
	 * 
	 * @param queryName
	 *            在配置文件中预定义的SQL串名字
	 * @param parms
	 * @param value
	 *            在SQL中预定义的参数对应值;
	 * @param cls
	 *            将List链表中的对象转化为指定的类实例对象;
	 * @return List<Object>
	 */
	List<Object> getListByParm(String queryName, String[] parms, Object[] value, Class cls);

	/**
	 * 通过在配置文件中预定义的SQL串名字查询结果集;
	 * 
	 * @param queryName
	 *            在配置文件中预定义的SQL串名字
	 * @param parms
	 * @param value
	 *            在SQL中预定义的参数对应值;
	 * @param cls
	 *            将List链表中的对象转化为指定的类实例对象;
	 * @return List<Object>
	 */
	List<Object> getListByCriteria(DetachedCriteria criteria);

	/**
	 * 通过在配置文件中预定义的SQL串名字查询结果集;
	 * 
	 * @param queryName
	 *            在配置文件中预定义的SQL串名字
	 * @param parms
	 *            在SQL中预定义的参数对应值;
	 * @param cls
	 *            将List链表中的对象转化为指定的类实例对象;
	 * @return
	 */
	List<Object> getListByParm(String queryName, Map<String, Object> pram, Class cls);

	List<T> getDocAll(Map<String, Object> parmMap);

	List<Object> getPageListByParm(String queryName, Map<String, Object> pram, Class cls, int start, int pagesize);

	List<Object> getListBySql(String queryName, String whereSql, Class cls, int start, int pagesize);

	List<Object> getListBySql(String queryName, String whereSql, Class cls);

	ClassMetadata getClassMetadata(Class<?> clsPo);

	AbstractEntityPersister getEntityPersister(Class<?> clsPo);
	
	/**###########################   新增      ###########################*/
	void updateBySql(String sql);
	
	public List<Object> getListByNativeSql(String sql, Class cls, int start, int pagesize);
	
	public List<Object> getListByNativeSql(String sql,int start, int pagesize);
	
	public List<Object> getListByNativeSql(String sql);
	
	public List<Object> getListByNativeSql(String sql, Class cls);
	
	public List<Object> getListByCriteria(DetachedCriteria criteria,int start,int maxResults);
	
	 
	public Integer getCountByNativeSql(String sql);
	  
	/**
	 * 调用存储过程
	 * @param inputArgs			输入参数集合
	 * @param outTypes			输出参数类型集合
	 * @param procedureName  过程名称
	 * @return
	 * @throws Exception
	 */
    public List<Object> execProc(List inputArgs,List outTypes,String procedureName) throws Exception;
}
